/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Usuario;

import java.awt.Color;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import clienteSandraParada.Login;
import clienteSandraParada.Mensajeria;
import com.itextpdf.text.BaseColor;
import java.awt.Shape;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.border.TitledBorder;

/**
 * El objetivo de esta clase es mostrar el formularioAdministracion con los
 * datos requeridos para registrar un Usuario en el Sistema.
 *
 * @author Franzel
 */
public class DialogoInfoUsuarioAdministracion extends javax.swing.JDialog {

    private int filaClick = -1;
    private int columnaClick = -1;
    private Usuario usuario;
    private String nombreUsuarioAnterior;
    private String valorAnterior;

    /**
     * Constructor de la clase, recibe todos los parámetros e inicializa las
     * variables de la clase
     */
    public DialogoInfoUsuarioAdministracion(java.awt.Frame parent, boolean modal, Usuario usuario) {
        super(parent, modal);
        initComponents();
        valorAnterior = "";
        setIconImage(new ImageIcon(getClass().getResource("/GUI/Img/logo2.png")).getImage());
        this.usuario = usuario;


        try {
            this.direccion.cargar();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        }



        this.setLocationRelativeTo(null);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        botonFormularioAccion = new javax.swing.JButton();
        botonFormularioSalida = new javax.swing.JButton();
        panelInfoCuenta = new javax.swing.JPanel();
        jLabel16 = new javax.swing.JLabel();
        jLabel18 = new javax.swing.JLabel();
        campoUsuario = new javax.swing.JTextField();
        jLabel20 = new javax.swing.JLabel();
        asterisco5 = new javax.swing.JLabel();
        asterisco6 = new javax.swing.JLabel();
        asterisco7 = new javax.swing.JLabel();
        campoContraseña = new javax.swing.JPasswordField();
        campoTipoCuenta = new javax.swing.JTextField();
        panelContacto = new javax.swing.JPanel();
        jLabel13 = new javax.swing.JLabel();
        jLabel14 = new javax.swing.JLabel();
        jLabel15 = new javax.swing.JLabel();
        campoTelefono = new componentes.Telefono();
        campoCelular = new componentes.Celular();
        campoEmail = new componentes.Correo();
        direccion = new componentes.Direccion();
        panelDatosPersonales = new javax.swing.JPanel();
        jLabel6 = new javax.swing.JLabel();
        campoApellidoPaterno = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        campoNombre = new javax.swing.JTextField();
        jLabel9 = new javax.swing.JLabel();
        campoFechaNac = new com.toedter.calendar.JDateChooser();
        campoRut = new componentes.Rut();
        jLabel10 = new javax.swing.JLabel();
        campoApellidoMaterno = new javax.swing.JTextField();
        asterisco1 = new javax.swing.JLabel();
        asterisco2 = new javax.swing.JLabel();
        asterisco3 = new javax.swing.JLabel();
        asterisco4 = new javax.swing.JLabel();
        camposObligatorios = new javax.swing.JLabel();
        mensajesAdvertencia = new javax.swing.JLabel();
        unCampoObligatorio = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setPreferredSize(new java.awt.Dimension(512, 600));

        botonFormularioAccion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Agregar.png"))); // NOI18N
        botonFormularioAccion.setText("Agregar");
        botonFormularioAccion.setToolTipText("Agregar");
        botonFormularioAccion.setAlignmentY(0.0F);
        botonFormularioAccion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFormularioAccionActionPerformed(evt);
            }
        });

        botonFormularioSalida.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Cancelar.png"))); // NOI18N
        botonFormularioSalida.setText("Cancelar");
        botonFormularioSalida.setToolTipText("Eliminar");
        botonFormularioSalida.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFormularioSalidaActionPerformed(evt);
            }
        });

        panelInfoCuenta.setBorder(javax.swing.BorderFactory.createTitledBorder("Informacion de la cuenta"));
        panelInfoCuenta.setForeground(new java.awt.Color(102, 255, 51));

        jLabel16.setText("Tipo de cuenta:");

        jLabel18.setText("Nombre de usuario: ");

        jLabel20.setText("Contraseña:");

        asterisco5.setText("*");

        asterisco6.setText("*");

        asterisco7.setText("*");

        javax.swing.GroupLayout panelInfoCuentaLayout = new javax.swing.GroupLayout(panelInfoCuenta);
        panelInfoCuenta.setLayout(panelInfoCuentaLayout);
        panelInfoCuentaLayout.setHorizontalGroup(
            panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel18)
                            .addComponent(jLabel20))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(campoContraseña)
                            .addComponent(campoUsuario))
                        .addGap(2, 2, 2)
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(asterisco6, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(asterisco7, javax.swing.GroupLayout.Alignment.TRAILING))
                        .addContainerGap())
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelInfoCuentaLayout.createSequentialGroup()
                        .addComponent(jLabel16)
                        .addGap(27, 27, 27)
                        .addComponent(campoTipoCuenta)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(asterisco5)
                        .addGap(8, 8, 8))))
        );
        panelInfoCuentaLayout.setVerticalGroup(
            panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel16, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(campoTipoCuenta))
                    .addComponent(asterisco5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                        .addComponent(jLabel18)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jLabel20, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoUsuario)
                            .addComponent(asterisco6, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoContraseña, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addContainerGap())
        );

        panelContacto.setBorder(javax.swing.BorderFactory.createTitledBorder("Contacto **"));
        panelContacto.setForeground(new java.awt.Color(102, 255, 51));

        jLabel13.setText("Teléfono:");

        jLabel14.setText("E-Mail:");

        jLabel15.setText("Celular:");

        javax.swing.GroupLayout panelContactoLayout = new javax.swing.GroupLayout(panelContacto);
        panelContacto.setLayout(panelContactoLayout);
        panelContactoLayout.setHorizontalGroup(
            panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContactoLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE)
                    .addComponent(jLabel15, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel14, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoCelular, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoTelefono, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoEmail, javax.swing.GroupLayout.PREFERRED_SIZE, 173, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(23, 23, 23))
        );
        panelContactoLayout.setVerticalGroup(
            panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContactoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel13, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoTelefono, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel15, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoCelular, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel14)
                    .addComponent(campoEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(17, Short.MAX_VALUE))
        );

        panelDatosPersonales.setBorder(javax.swing.BorderFactory.createTitledBorder("Datos personales"));
        panelDatosPersonales.setForeground(new java.awt.Color(102, 255, 51));

        jLabel6.setText("Rut:");

        jLabel7.setText("Apellido paterno:");

        jLabel8.setText("Nombres: ");

        jLabel9.setText("Fecha nacimiento:");

        jLabel10.setText("Apellido materno:");

        asterisco1.setText("*");

        asterisco2.setText("*");

        asterisco3.setText("*");

        asterisco4.setText("*");

        javax.swing.GroupLayout panelDatosPersonalesLayout = new javax.swing.GroupLayout(panelDatosPersonales);
        panelDatosPersonales.setLayout(panelDatosPersonalesLayout);
        panelDatosPersonalesLayout.setHorizontalGroup(
            panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addComponent(jLabel6)
                        .addGap(71, 71, 71)
                        .addComponent(campoRut, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(asterisco1, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel10)
                            .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jLabel7, javax.swing.GroupLayout.Alignment.LEADING))
                            .addComponent(jLabel9))
                        .addGap(4, 4, 4)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(campoApellidoPaterno)
                            .addComponent(campoNombre, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE)
                            .addComponent(campoApellidoMaterno)
                            .addComponent(campoFechaNac, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(asterisco4, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco3, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco2, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        panelDatosPersonalesLayout.setVerticalGroup(
            panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(asterisco1, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoRut, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoApellidoPaterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoApellidoMaterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDatosPersonalesLayout.createSequentialGroup()
                        .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(8, 8, 8)
                        .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel9)
                    .addComponent(campoFechaNac, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        camposObligatorios.setText("* Campos obligatorios");

        mensajesAdvertencia.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        mensajesAdvertencia.setText("Área de mensajería");

        unCampoObligatorio.setText("** Al menos ingresar un campo");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(unCampoObligatorio, javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                .addComponent(panelContacto, javax.swing.GroupLayout.PREFERRED_SIZE, 251, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(panelInfoCuenta, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                            .addComponent(camposObligatorios, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(direccion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 482, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(panelDatosPersonales, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(20, 20, 20))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(mensajesAdvertencia, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(291, 291, 291)
                                .addComponent(botonFormularioAccion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(botonFormularioSalida, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                        .addGap(19, 19, 19))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelDatosPersonales, javax.swing.GroupLayout.PREFERRED_SIZE, 154, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(direccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(panelContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(panelInfoCuenta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(camposObligatorios, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(2, 2, 2)
                .addComponent(unCampoObligatorio)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(botonFormularioAccion)
                    .addComponent(botonFormularioSalida))
                .addGap(18, 18, 18)
                .addComponent(mensajesAdvertencia, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public void agregarFocusListenerRut() {
        this.cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
        campoRut.getRut().addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent fe) {
            }

            @Override
            public void focusLost(FocusEvent fe) {
                if (!campoRut.isValido()) {
                    cambiarEtiquetaMensajeria(Mensajeria.mensajeRutValido(), Color.red);
                    campoRut.getRut().requestFocus();
                } else {
                    cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
                    service.Usuario u = (service.Usuario) cargarUsuario(campoRut.getRut().getText());
                    if (u != null) {
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeEntidadExistente("Usuario"), Color.red);
                        campoRut.getRut().requestFocus();
                    }
                }
            }
        });
    }

    /**
     * Método Action Performed del boton de Accion en el
     * formularioAdministracion Usuario.
     *
     * @param variable de tipo ActionEvent con el evento del boton.
     *
     */
    private void botonFormularioAccionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFormularioAccionActionPerformed

        java.util.List<service.Usuario> usuarios = this.listarUsuarios();
        boolean encontrado = false;
        //Revisa que un usuario creado no se repita

        if (validarCampos()) {

            int fila = -1;
            if (this.getTitle().equals("Agregar Usuario")) {

                if (!campoRut.isValido()) {
                    cambiarEtiquetaMensajeria(Mensajeria.mensajeRutValido(), Color.red);
                    return;
                }
                for (service.Usuario u : usuarios) {
                    if (u.getRut().equals(campoRut.getRut().getText()) || u.getUsuario().equals(campoUsuario.getText())) {
                        encontrado = true;
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeEntidadExistente("Usuario"), Color.red);
                        return;
                    }
                }
                if (!encontrado) {
                    this.dispose();
                    service.Usuario u = new service.Usuario();
                    service.Privilegios p = new service.Privilegios();
                    p.setRutUsuario(campoRut.getRut().getText());
                    agregarPrivilegios(p);
                    u.setRut(campoRut.getRut().getText());
                    u.setTipoCuenta(campoTipoCuenta.getText());
                    Privilegios privilegios = new Privilegios(null, true, null);
                    privilegios.setUsuario(u);
                    if (u.getTipoCuenta().equals("Administrador")) {
                        privilegios.privilegiosAdministrador();
                    } else if (u.getTipoCuenta().equals("Secretaria")) {
                        privilegios.privilegiosSecretaria();
                    }
                    privilegios.guardarPrivilegios();
                    //agrego usuario
                    cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
                    service.Usuario us = crearObjetoUsuario(new service.Usuario());
                    agregarUsuario(us);
                    //llamar bitacora
                    if (usuario != null) {
                        String valorNuevo = "Rut: " + us.getRut() + "\n" + "Nombres: " + us.getNombres() + "\n" + "Apellido Paterno: " + us.getApellidoPaterno() + "Apellido Materno: " + us.getApellidoMaterno()
                                + "\n" + "Usuario: " + us.getUsuario() + "\n" + "Bloque: " + us.getBloque() + "\n" + "Calle: " + us.getCalle() + "\n" + "Celular: " + us.getCelular() + "\n" + "Comuna: " + us.getComuna() + "\n" + "Departamento: " + us.getDepto() + "\n" + "Email: " + us.getEmail()
                                + "\n" + "Fecha nacimiento: " + us.getFechaNac() + "\n" + "Número calle: " + us.getNumero() + "\n" + "Provincia: " + us.getProvincia()
                                + "\n" + "Región: " + us.getRegion() + "\n" + "Sector: " + us.getSector() + "\n" + "Teléfono: " + us.getTelefono() + "\n" + "Tipo cuenta: " + us.getTipoCuenta();
                        registrar(Login.getUser(), "Usuario", "Agregó usuario: " + us.getRut(), "No aplica", valorNuevo);
                        this.usuario.getjLabel5().setText(Mensajeria.mensajeDeAccion("Usuario", "agregar"));
                        fila = this.usuario.getContenedorUsuarios().getRowCount();
                        DefaultTableModel modelo = (DefaultTableModel) this.usuario.getContenedorUsuarios().getModel();
                        modelo.addRow(new String[4]);
                    }
                }
            } else if (this.getTitle().equals("Modificar Usuario") || this.getTitle().equals("Perfil de Usuario")) {
                encontrado = false;
                service.Usuario aux = (service.Usuario) cargarUsuario(campoRut.getRut().getText());
                service.Usuario us = crearObjetoUsuario(aux);
                if (!nombreUsuarioAnterior.equals(campoUsuario.getText())) {
                    for (service.Usuario u : usuarios) {
                        if (u.getUsuario().equals(campoUsuario.getText())) {
                            encontrado = true;
                            cambiarEtiquetaMensajeria(Mensajeria.mensajeEntidadExistente("Usuario"), Color.red);
                            return;
                        }
                    }
                }
                if (!encontrado) {
                    this.dispose();
                    modificarUsuario(us);
                    String valorNuevo = "Rut: " + us.getRut() + "\n" + "Nombres: " + us.getNombres() + "\n" + "Apellido Paterno: " + us.getApellidoPaterno() + "Apellido Materno: " + us.getApellidoMaterno()
                            + "\n" + "Usuario: " + us.getUsuario() + "\n" + "Bloque: " + us.getBloque() + "\n" + "Calle: " + us.getCalle() + "\n" + "Celular: " + us.getCelular() + "\n" + "Comuna: " + us.getComuna() + "\n" + "Departamento: " + us.getDepto() + "\n" + "Email: " + us.getEmail()
                            + "\n" + "Fecha nacimiento: " + us.getFechaNac() + "\n" + "Número calle: " + us.getNumero() + "\n" + "Provincia: " + us.getProvincia()
                            + "\n" + "Región: " + us.getRegion() + "\n" + "Sector: " + us.getSector() + "\n" + "Teléfono: " + us.getTelefono() + "\n" + "Tipo cuenta: " + us.getTipoCuenta();
                    registrar(Login.getUser(), "Usuario", "Modificó usuario: " + us.getRut(), valorAnterior, valorNuevo);
                    this.usuario.getjLabel5().setText(Mensajeria.mensajeDeAccion("Usuario", "modificar"));
                    fila = this.usuario.getContenedorUsuarios().getSelectedRow();
                }

            } else {
                this.dispose();
                service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
                if (p.isExportarUsuario()) {
                    fila = -1;
                    try {
                        exportarPDF();
                    } catch (DocumentException ex) {
                        Logger.getLogger(DialogoInfoUsuarioAdministracion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (FileNotFoundException ex) {
                        Logger.getLogger(DialogoInfoUsuarioAdministracion.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
                }
            }

            if (fila != -1) {
                usuario.getContenedorUsuarios().setValueAt((String) this.campoTipoCuenta.getText(), fila, 0);
                usuario.getContenedorUsuarios().setValueAt(this.campoRut.getRut().getText(), fila, 1);
                usuario.getContenedorUsuarios().setValueAt(this.campoUsuario.getText(), fila, 2);
                usuario.getContenedorUsuarios().setValueAt(this.campoEmail.getCorreo().getText(), fila, 3);
                usuario.getContenedorUsuarios().setValueAt(this.campoCelular.getCelular().getText(), fila, 4);
            }

        }


    }//GEN-LAST:event_botonFormularioAccionActionPerformed

    /**
     * Método Action Performed del boton de Salida en el
     * formularioAdministracion Usuario
     *
     * @param variable de tipo ActionEvent con el evento del boton
     *
     */
    private void botonFormularioSalidaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFormularioSalidaActionPerformed
        // TODO add your handling code here:
        this.cambiarEtiquetaMensajeria("Área de mensajeria", Color.black);
        this.dispose();
}//GEN-LAST:event_botonFormularioSalidaActionPerformed
    /**
     * Método Action Performed de la tabla que almacena los horarios disponibles
     * de un Usuario.
     *
     * @param variable de tipo MouseEvent con el evento del mouse en la tabla
     *
     */
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel asterisco1;
    private javax.swing.JLabel asterisco2;
    private javax.swing.JLabel asterisco3;
    private javax.swing.JLabel asterisco4;
    private javax.swing.JLabel asterisco5;
    private javax.swing.JLabel asterisco6;
    private javax.swing.JLabel asterisco7;
    public javax.swing.JButton botonFormularioAccion;
    public javax.swing.JButton botonFormularioSalida;
    private javax.swing.JTextField campoApellidoMaterno;
    private javax.swing.JTextField campoApellidoPaterno;
    private componentes.Celular campoCelular;
    private javax.swing.JPasswordField campoContraseña;
    private componentes.Correo campoEmail;
    private com.toedter.calendar.JDateChooser campoFechaNac;
    private javax.swing.JTextField campoNombre;
    public componentes.Rut campoRut;
    private componentes.Telefono campoTelefono;
    public javax.swing.JTextField campoTipoCuenta;
    private javax.swing.JTextField campoUsuario;
    private javax.swing.JLabel camposObligatorios;
    private componentes.Direccion direccion;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel18;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JLabel mensajesAdvertencia;
    private javax.swing.JPanel panelContacto;
    private javax.swing.JPanel panelDatosPersonales;
    private javax.swing.JPanel panelInfoCuenta;
    private javax.swing.JLabel unCampoObligatorio;
    // End of variables declaration//GEN-END:variables

    /**
     * Método que deja en blanco todos los campos del diálogo
     * formularioAdministracion.
     *
     */
    public void limpiarCampos() {
        this.campoApellidoPaterno.setText("");
        this.campoApellidoMaterno.setText("");
        this.campoCelular.getCelular().setText("");
        this.campoContraseña.setText("");
        this.campoEmail.getCorreo().setText("");
        this.campoFechaNac.setDate(null);
        this.campoNombre.setText("");
        this.campoRut.getRut().setText("");
        this.campoTelefono.getTelefono().setText("");
        this.campoTipoCuenta.setText("");
        this.campoUsuario.setText("");
        this.direccion.getBloque().setText("");
        this.direccion.getCalle().setText("");
        this.direccion.getComuna().setSelectedItem("Seleccionar");
        this.direccion.getProvincia().setSelectedItem("Seleccionar");
        this.direccion.getBloque().setText("");
        this.direccion.getDepartamento().setText("");
        direccion.getNumero().setText("");
        this.direccion.getSector().setText("");
        this.direccion.getRegion().setSelectedItem("Seleccionar");
    }

    /**
     * Método que llena todos los campos del diálogo formularioAdministracion a
     * partir de un Usuario entregado.
     *
     * @param variable user de tipo service.Usuario, que contiene el usuario con
     * el que se llenaran los campos
     *
     */
    public void llenarCampos(service.Usuario user) {
        valorAnterior = "Rut: " + user.getRut() + "\n" + "Nombres: " + user.getNombres() + "\n" + "Apellido Paterno: " + user.getApellidoPaterno() + "\n" + "Apellido Materno: " + user.getApellidoMaterno()
                + "\n" + "Usuario: " + user.getUsuario() + "\n" + "Bloque: " + user.getBloque() + "\n" + "Calle: " + user.getCalle() + "\n" + "Celular: " + user.getCelular() + "\n" + "Comuna: " + user.getComuna() + "\n" + "Departamento: " + user.getDepto() + "\n" + "Email: " + user.getEmail()
                + "\n" + "Fecha nacimiento: " + user.getFechaNac() + "\n" + "Número calle: " + user.getNumero() + "\n" + "Provincia: " + user.getProvincia()
                + "\n" + "Región: " + user.getRegion() + "\n" + "Sector: " + user.getSector() + "\n" + "Teléfono: " + user.getTelefono() + "\n" + "Tipo cuenta: " + user.getTipoCuenta();

        this.nombreUsuarioAnterior = user.getUsuario();
        this.campoApellidoPaterno.setText(user.getApellidoPaterno());
        this.campoApellidoMaterno.setText(user.getApellidoMaterno());
        this.campoCelular.getCelular().setText(user.getCelular());
        this.campoContraseña.setText(user.getContrasenia());
        this.campoEmail.getCorreo().setText(user.getEmail());
        this.campoNombre.setText(user.getNombres());
        this.campoRut.getRut().setText(user.getRut());
        this.campoRut.getRut().setEnabled(false);
        this.campoTelefono.getTelefono().setText(user.getTelefono());
        this.campoTipoCuenta.setText(user.getTipoCuenta());
        this.campoUsuario.setText(user.getUsuario());
        this.direccion.getBloque().setText(user.getBloque());
        this.direccion.getCalle().setText(user.getCalle());
        this.direccion.getRegion().setSelectedItem(user.getRegion());
        this.direccion.getProvincia().setSelectedItem(user.getProvincia());
        this.direccion.getComuna().setSelectedItem(user.getComuna());
        this.direccion.getDepartamento().setText(user.getDepto());
        direccion.getNumero().setText(user.getNumero());
        this.direccion.getSector().setText(user.getSector());
        if (!user.getFechaNac().equals("dd-MM-yyyy")) {
            this.campoFechaNac.setDate(stringToDate(user.getFechaNac()));
        }


    }

    /**
     * Método que crea un objeto de tipo Usuario seteando los campos de acuerdo
     * al usuario que se entrega como parametro.
     *
     * @param variable user de tipo service.Usuario que contiene el usuario a
     * modificar.
     * @return devuelve el objeto de tipo service.Usuario con los campos
     * requeridos.
     *
     */
    public service.Usuario crearObjetoUsuario(service.Usuario user) {

        user.setNombres(campoNombre.getText());
        user.setApellidoPaterno(campoApellidoPaterno.getText());
        user.setApellidoMaterno(campoApellidoMaterno.getText());
        user.setBloque(direccion.getBloque().getText());
        user.setCalle(direccion.getCalle().getText());
        user.setCelular(campoCelular.getCelular().getText());
        user.setComuna((String) direccion.getComuna().getSelectedItem());
        user.setDepto(direccion.getDepartamento().getText());
        user.setEmail(campoEmail.getCorreo().getText());
        user.setNumero(direccion.getNumero().getText());
        user.setProvincia((String) direccion.getProvincia().getSelectedItem());
        user.setRut(campoRut.getRut().getText());
        user.setSector(direccion.getSector().getText());
        user.setTelefono(campoTelefono.getTelefono().getText());
        user.setTipoCuenta(campoTipoCuenta.getText());
        user.setUsuario(campoUsuario.getText());
        user.setActivo(true);
        user.setFechaNac(capturarFechaDeNacimiento());
        user.setRegion((String) direccion.getRegion().getSelectedItem());

        String contraseña = new String(campoContraseña.getPassword());
        if (user.getContrasenia() == null || user.getContrasenia().equals(contraseña) == false) {
            user.setContrasenia(Login.getStringMessageDigest(contraseña));
        }

        return user;


    }

    /**
     * Método que habilita o deshabilita los campos que se encuentran en el
     * formularioAdministracion, de acuerdo a la opción que tenga como
     * parámetro.
     *
     * @param variable opcion de tipo boolean, cuando es true se habilitan los
     * campos, en caso contrario se deshabilitan.
     *
     */
    public void habilitarCampos(boolean opcion) {

        this.campoApellidoPaterno.setEditable(opcion);
        this.campoApellidoMaterno.setEditable(opcion);
        this.campoCelular.getCelular().setEditable(opcion);
        this.campoContraseña.setEditable(opcion);
        this.campoEmail.getCorreo().setEditable(opcion);
        this.campoFechaNac.setEnabled(opcion);
        this.campoNombre.setEditable(opcion);
        this.campoRut.getRut().setEnabled(opcion);
        this.campoTelefono.getTelefono().setEditable(opcion);
        this.campoTipoCuenta.setEnabled(opcion);
        this.campoUsuario.setEditable(opcion);
        this.direccion.getCalle().setEditable(opcion);
        this.direccion.getComuna().setEnabled(opcion);
        this.direccion.getProvincia().setEnabled(opcion);
        this.direccion.getBloque().setEditable(opcion);
        this.direccion.getDepartamento().setEditable(opcion);
        direccion.getNumero().setEditable(opcion);//getNumerosetEditable(opcion);
        this.direccion.getSector().setEditable(opcion);
        this.direccion.getRegion().setEnabled(opcion);

    }

    /**
     * Método que pasa una fecha con el formato de String a Date.
     *
     * @param variable de tipo String llamada strFecha.
     * @return una variable del tipo Date con la fecha convertida a Date.
     *
     */
    public Date stringToDate(String strFecha) {
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
        Date fecha = null;
        try {
            fecha = formatoDelTexto.parse(strFecha);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return fecha;
    }

    /**
     * Método que exporta a PDF la información del usuario que se está
     * visualizando.
     *
     */
    public void exportarPDF() throws DocumentException, FileNotFoundException {
        Document document = new Document();
        String dirArchivo = eligeDireccionArchivo();

        if (!dirArchivo.equals(".pdf")) {
            /*Sección para hacer el pdf, el cuál queda guardado en escritorio con el nombre de Usuario*/

            Font fondoTitulo = new Font(Font.FontFamily.TIMES_ROMAN, 16, Font.BOLD);
            Font fondoSubTitulo = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dirArchivo));
            document.open();
            Paragraph p = new Paragraph("Información Usuario", fondoTitulo);
            p.setFirstLineIndent(150);
            document.add(p);

            /*Datos Personales*/
            p = new Paragraph("Datos Personales", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaDatosPersonales = new PdfPTable(2);
            tablaDatosPersonales.addCell("Rut");
            tablaDatosPersonales.addCell(campoRut.getRut().getText());
            tablaDatosPersonales.addCell("Nombres");
            tablaDatosPersonales.addCell(campoNombre.getText());
            tablaDatosPersonales.addCell("Apellido Paterno");
            tablaDatosPersonales.addCell(campoApellidoPaterno.getText());
            tablaDatosPersonales.addCell("Apellido Materno");
            tablaDatosPersonales.addCell(campoApellidoMaterno.getText());
            tablaDatosPersonales.addCell("Fecha de Nacimiento");
            tablaDatosPersonales.addCell(capturarFechaDeNacimiento());
            document.add(tablaDatosPersonales);

            /*Datos Dirección*/
            p = new Paragraph("Datos Dirección", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaDatosDir = new PdfPTable(2);
            if (((String) direccion.getRegion().getSelectedItem()).equals("Seleccionar") == false) {
                tablaDatosDir.addCell("Región");
                tablaDatosDir.addCell((String) direccion.getRegion().getSelectedItem());
            }
            if (((String) direccion.getProvincia().getSelectedItem()).equals("Seleccionar") == false) {
                tablaDatosDir.addCell("Provincia");
                tablaDatosDir.addCell((String) direccion.getProvincia().getSelectedItem());
            }
            if (!((String) direccion.getComuna().getSelectedItem() == null)) {
                tablaDatosDir.addCell("Comuna");
                tablaDatosDir.addCell((String) direccion.getComuna().getSelectedItem());
            }
            if (direccion.getSector().getText().equals("") == false) {
                tablaDatosDir.addCell("Sector");
                tablaDatosDir.addCell(direccion.getSector().getText());
            }
            if (direccion.getCalle().getText().equals("") == false) {
                tablaDatosDir.addCell("Calle");
                tablaDatosDir.addCell(direccion.getCalle().getText());
            }
            if (direccion.getNumero().getText().equals("0") == false) {
                tablaDatosDir.addCell("Número");
                tablaDatosDir.addCell(direccion.getNumero().getText());
            }
            if (direccion.getDepartamento().getText().equals("") == false) {
                tablaDatosDir.addCell("Departamento");
                tablaDatosDir.addCell(direccion.getDepartamento().getText());
            }
            if (direccion.getBloque().getText().equals("") == false) {
                tablaDatosDir.addCell("Bloque");
                tablaDatosDir.addCell(direccion.getBloque().getText());
            }
            document.add(tablaDatosDir);

            /*Contacto*/
            p = new Paragraph("Contacto", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaDatosContacto = new PdfPTable(2);
            if (!campoTelefono.getTelefono().getText().equals("")) {
                tablaDatosContacto.addCell("Teléfono");
                tablaDatosContacto.addCell(campoTelefono.getTelefono().getText());
            }
            if (!campoCelular.getCelular().getText().equals("")) {
                tablaDatosContacto.addCell("Celular");
                tablaDatosContacto.addCell(campoCelular.getCelular().getText());
            }
            if (!campoEmail.getCorreo().getText().equals("")) {
                tablaDatosContacto.addCell("E-mail");
                tablaDatosContacto.addCell(campoEmail.getCorreo().getText());
            }
            document.add(tablaDatosContacto);

            /*Información de la Cuenta*/
            p = new Paragraph("Información de la Cuenta", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaInfoUsuario = new PdfPTable(2);
            tablaInfoUsuario.addCell("Tipo de Cuenta");
            tablaInfoUsuario.addCell((String) campoTipoCuenta.getText());
            tablaInfoUsuario.addCell("Usuario");
            tablaInfoUsuario.addCell(campoUsuario.getText());
            document.add(tablaInfoUsuario);


            document.close();
            abrirArchivo(dirArchivo);
        }

    }

    /**
     * Método en el cual se elige el directorio para exportar a PDF, con
     * jfileChooser.
     *
     * @return una variable de tipo String que contiene la dirección en donde se
     * almacenará el PDF.
     *
     */
    public String eligeDireccionArchivo() {
        String dirArchivo = "";
        JFileChooser jFileChooser1 = new JFileChooser();
        jFileChooser1.setDialogTitle("Guardar archivo:");
        jFileChooser1.setVisible(true);

        int r = jFileChooser1.showSaveDialog(null);
        if (r == JFileChooser.APPROVE_OPTION) {
            File file = jFileChooser1.getSelectedFile();
            dirArchivo = String.valueOf(file);
        }
        dirArchivo = dirArchivo.replace('\\', '/') + ".pdf";
        return dirArchivo;

    }

    /**
     * Método que abre el PDF de acuerdo a la dirección especificada.
     *
     * @param variable de tipo String que contiene la dirección necesaria para
     * abrir el documento.
     *
     */
    public void abrirArchivo(String direccion) {
        //Abre el documento pdf
        try {
            File file = new File(direccion);
            Desktop.getDesktop().open(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Método captura la fecha de naciemiento del Usuario.
     *
     * @return una variable de tipo String que contiene la fecha de Nacimiento.
     *
     */
    public String capturarFechaDeNacimiento() {
        Calendar cal = Calendar.getInstance();
        String fecha = "dd-MM-yyyy";
        if (this.campoFechaNac.getDate() != null) {
            cal.setTime(this.campoFechaNac.getDate());
            //Dia - mes - año
            fecha = Integer.toString(cal.get(Calendar.DAY_OF_MONTH)) + "-"
                    + Integer.toString(cal.get(Calendar.MONTH) + 1) + "-"
                    + Integer.toString(cal.get(Calendar.YEAR));
        }
        return fecha;

    }

    public void camposObligatoriosVisibles(boolean opcion) {
        this.asterisco1.setVisible(opcion);
        this.asterisco2.setVisible(opcion);
        this.asterisco3.setVisible(opcion);
        this.asterisco4.setVisible(opcion);
        this.asterisco5.setVisible(opcion);
        this.asterisco6.setVisible(opcion);
        this.asterisco7.setVisible(opcion);
        this.camposObligatorios.setVisible(opcion);
        this.unCampoObligatorio.setVisible(opcion);
        this.mensajesAdvertencia.setVisible(opcion);

        if (opcion) {
            this.panelContacto.setBorder(new TitledBorder("Contacto **"));
            this.setSize(512, 600);
        } else {
            this.setSize(512, 540);
            this.panelContacto.setBorder(new TitledBorder("Contacto"));
        }
    }

    /**
     * Método que valida los campos que se han ingresadoen el
     * formularioAdministracion, emitiendo un mensaje de advertencia en caso de
     * ser necesario. Estos campos son telefono, email, celular, usuario,
     * nombre, apellido paterno, apellido materno, contraseña y rut.
     *
     * @return una variable de tipo boolean. Cuando es true, significa que son
     * validos los campos.
     *
     */
    public boolean validarCampos() {
        boolean hayContacto = false;
        String contraseña = new String(campoContraseña.getPassword());


        if (!campoTelefono.getTelefono().getText().equals("")
                || !campoEmail.getCorreo().getText().equals("")
                || !campoCelular.getCelular().getText().equals("")) {
            hayContacto = true;
        }


        if (hayContacto
                && !contraseña.equals("") && !campoUsuario.getText().equals("")
                && !campoNombre.getText().equals("")
                && !campoApellidoPaterno.getText().equals("") && !campoApellidoMaterno.getText().equals("")) {
            cambiarEtiquetaMensajeria("Área de mensajería", Color.black);

            return true;
        }
        cambiarEtiquetaMensajeria(Mensajeria.mensajeCamposObligatorios(), Color.red);

        return false;
    }

    /**
     * Método que retorna el label en donde se dan a conocer los mensajes de
     * advertencia.
     *
     * @return variable de tipo JLabel.
     *
     */
    public JLabel getMensajesAdvertencia() {
        return mensajesAdvertencia;
    }

    /**
     * Método que cambia el mensaje del diálogo de acuerdo a lo que se requiera.
     *
     * @param variable de tipo String con el mensaje
     * @param variable de tipo Color con el color del mensaje
     *
     */
    public void cambiarEtiquetaMensajeria(String mensaje, Color color) {
        this.mensajesAdvertencia.setText(mensaje);
        this.mensajesAdvertencia.setForeground(color);

    }

    /**
     * Aqui comienzan los métodos correspondientes a los servicios
     *
     */
    /**
     * Método que retorna la lista de Usuarios que estan en la Base de Datos, a
     * través del servicio listarUsuarios.
     *
     * @return variable de tipo java.util.List<service.Usuario> que contiene la
     * lista de usuarios.
     *
     */
    private static java.util.List<service.Usuario> listarUsuarios() {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        return port.listarUsuarios();
    }

    /**
     * Método que modifica el usuario que esta registrado en la Base de Datos, a
     * través del servicio modificarUsuario.
     *
     * @param variable de tipo service.Usuario llamada arg0 que es el usuario a
     * modificar.
     * @return variable de tipo boolean que indica si se realizó (true) o no
     * (false) la actualización del usuario.
     *
     */
    private static boolean modificarUsuario(service.Usuario arg0) {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        return port.modificarUsuario(arg0);
    }

    /**
     * Método que registra el usuario en la Base de Datos, a través del servicio
     * agregarUsuario.
     *
     * @param variable de tipo service.Usuario llamada arg0 que es el usuario a
     * registrar.
     * @return variable de tipo boolean que indica si se realizó (true) o no
     * (false) el regitro del usuario.
     *
     */
    private static boolean agregarUsuario(service.Usuario arg0) {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        System.out.println("se agrego");
        return port.agregarUsuario(arg0);
    }

    /**
     * Método que carga el usuario de la Base de Datos, a partir de un rut y a
     * través del servicio cargarUsuario.
     *
     * @param variable de tipo String correspondiente al rut usuario a cargar.
     * @return variable de tipo Object que corresponde al Usuario cargado.
     *
     */
    private static Object cargarUsuario(java.lang.String rut) {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        return port.cargarUsuario(rut);
    }

    /**
     * Método registra en la bitácora la acción realizada en el sistema
     *
     */
    private static Long registrar(service.Usuario usuario, java.lang.String modulo, java.lang.String accion, java.lang.String valorAnterior, java.lang.String valorNuevo) {
        service.BitacoraWSService service = new service.BitacoraWSService();
        service.BitacoraWS port = service.getBitacoraWSPort();
        return port.registrar(usuario, modulo, accion, valorAnterior, valorNuevo);
    }

    private static boolean agregarPrivilegios(service.Privilegios privilegios) {
        service.PrivilegiosWS_Service service = new service.PrivilegiosWS_Service();
        service.PrivilegiosWS port = service.getPrivilegiosWSPort();
        return port.agregarPrivilegios(privilegios);
    }

    private static Object cargarPrivilegios(java.lang.String rut) {
        service.PrivilegiosWS_Service service = new service.PrivilegiosWS_Service();
        service.PrivilegiosWS port = service.getPrivilegiosWSPort();
        return port.cargarPrivilegios(rut);
    }
}
